revealer: Only clip child when animating
authorErnestas Kulik <ernestask@gnome.org>
Wed, 22 Aug 2018 09:23:50 +0000 (12:23 +0300)
committerErnestas Kulik <ernestask@gnome.org>
Thu, 23 Aug 2018 08:13:36 +0000 (11:13 +0300)
Currently, GtkRevealer clips the child if the transition type is
sliding, regardless of whether the animation had already ended. An
example where that is a problem would be in Nautilus: the file
operations popover button is animated on reveal to draw attention, but,
given that the button is in turn stashed inside a revealer with a
sliding animation, things suddenly fall apart.

gtk/gtkrevealer.c

index 49aa81458e2068cf937eaf128de6d5847341ff3f..13c37b9a8006bdce748ed61ec4cedd359f4a165a 100644 (file)
@@ -617,20 +617,20 @@ gtk_revealer_snapshot (GtkWidget   *widget,
                        GtkSnapshot *snapshot)
 {
   GtkRevealer *revealer = GTK_REVEALER (widget);
+  GtkRevealerPrivate *priv = gtk_revealer_get_instance_private (revealer);
   GtkRevealerTransitionType transition;
   GtkWidget *child;
+  gboolean clip_child;
 
   child = gtk_bin_get_child (GTK_BIN (revealer));
   if (child == NULL || !gtk_widget_get_mapped (child))
     return;
 
   transition = effective_transition (revealer);
-  if (transition == GTK_REVEALER_TRANSITION_TYPE_NONE ||
-      transition == GTK_REVEALER_TRANSITION_TYPE_CROSSFADE)
-    {
-      gtk_widget_snapshot_child (widget, child, snapshot);
-    }
-  else
+  clip_child = transition != GTK_REVEALER_TRANSITION_TYPE_NONE &&
+               transition != GTK_REVEALER_TRANSITION_TYPE_CROSSFADE &&
+               gtk_progress_tracker_get_state (&priv->tracker) != GTK_PROGRESS_STATE_AFTER;
+  if (clip_child)
     {
       gtk_snapshot_push_clip (snapshot,
                               &GRAPHENE_RECT_INIT(
@@ -641,6 +641,8 @@ gtk_revealer_snapshot (GtkWidget   *widget,
       gtk_widget_snapshot_child (widget, child, snapshot);
       gtk_snapshot_pop (snapshot);
     }
+  else
+    gtk_widget_snapshot_child (widget, child, snapshot);
 }
 
 /**